from ..repositories import users_repository
from ..repositories.users_repository import get_user_by_phone, update_password_by_id
from ..utils.password_utils import encrypt_password, decrypt_password
import re


async def validate_verify_data(phone, verify_code):
    """
    验证忘记密码数据
    :param phone: 手机号
    :param verify_code: 验证码
    :return: (bool, str) - (验证是否通过, 错误信息)
    """
    # 验证手机号：11位数字
    if not re.match(r'^1[3-9]\d{9}$', phone):
        return False, "请输入有效的手机号格式"

    # 验证验证码：4位数字
    if not verify_code or not verify_code.isdigit() or len(verify_code) != 4:
        return False, "验证码必须是4位数字"

    return True, ""


async def verify(phone, verify_code):
    """
    忘记密码验证
    :param phone: 手机号
    :param verify_code: 验证码
    :return: 忘记密码验证结果
    """
    result = {
        "code": 0,
        "message": "验证成功"
    }

    # 1. 首先验证输入数据
    is_valid, error_message = await validate_verify_data(phone, verify_code)
    if not is_valid:
        return {"code": 1000, "message": error_message}

    # 2. 从数据库获取有效验证码
    valid_code = await users_repository.get_valid_code(phone)
    if not valid_code:
        return False, "验证码已过期或不存在"

    if decrypt_password(valid_code['code']) != verify_code:
        return False, "验证码错误"

    # 3. 检查用户是否存在
    user = await get_user_by_phone(phone)
    if not user:
        return {"code": 1002, "message": "手机号不存在"}

    result["username"] = user["username"]
    return result


async def validate_reset_password_data(phone, password):
    """
    验证新密码
    :param phone: 手机号
    :param password: 密码
    :return: (bool, str) - (验证是否通过, 错误信息)
    """
    # 验证手机号：11位数字
    if not phone or not phone.isdigit() or len(phone) != 11:
        return False, "请输入有效的11位手机号码"

    # 验证密码：6-16位字母数字
    if not password or not (6 <= len(password) <= 16) or not password.isalnum():
        return False, "密码必须是6-16位字母或数字的组合"

    return True, ""


async def reset_password(phone, password):
    """
    修改密码结果
    :param phone: 手机号
    :param password: 密码
    :return: 修改密码结果
    """
    result = {
        "code": 0,
        "message": "密码修改成功"
    }

    # 1. 首先验证输入数据
    is_valid, error_message = await validate_reset_password_data(phone, password)
    if not is_valid:
        return {"code": 1000, "message": error_message}

    # 2. 检查用户是否存在
    user = await get_user_by_phone(phone)
    if not user:
        return {"code": 1002, "message": "手机号不存在"}

    # 3. 加密密码并更新
    encrypted_password = encrypt_password(password)
    if not await update_password_by_id(user["id"], encrypted_password):
        return {"code": 1004, "message": "密码修改失败，请稍后重试"}

    return result
